﻿using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;

namespace MikroMagazaObject
{
    public class SiemensData
    {
        private List<string> _barkod = new List<string>();
        public string StokKodu { get; set; }
        public byte BarkodTipi { get; set; }
        public string StokAdi { get; set; }
        public string AnaGrupKodu { get; set; }
        public string AnaGrupAdi { get; set; }
        public string AltGrupKodu { get; set; }
        public string AltGrupAdi { get; set; }
        public string ReyonKodu { get; set; }
        public string ReyonAdi { get; set; }
        public List<string> Barkodlar { get { return _barkod; } }
        public string Birim1Adi { get; set; }
        public int Birim1Katsayi { get; set; }
        public string Birim2Adi { get; set; }
        public decimal Birim2Katsayi { get; set; }
        public decimal GenelFiyat { get; set; }
        public decimal DepoFiyati { get; set; }
        public DateTime Tarih { get; set; }
        public string TeminciKodu { get; set; }
        public decimal KdvOrani { get; set; }
    }

    public class SiemensPos
    {
        public string CnnString { get; set; }
        public string SqlCommand { get; set; }
        public string FileLocation { get; set; }

        public string DepoID { get; set; }
        public DateTime Tarih { get; set; }

        List<SiemensData> data = new List<SiemensData>();

        string KdvSiralamasi = "";

        private IEnumerable<int> dataYukle()
        {
            string[] oranlar = KdvSiralamasi.Split(',');

            int Counter = 0;
            using (OleDbConnection cn = new OleDbConnection(CnnString))
            {
                cn.Open();
                using (OleDbCommand cmd = new OleDbCommand(SqlCommand, cn))
                {
                    cmd.Parameters.Add("@depoid", OleDbType.VarChar).Value = DepoID;
                    if (!SqlCommand.Contains("2"))
                    {
                        cmd.Parameters.Add("@tarih", OleDbType.Date).Value = Tarih;
                    }
                    else
                    {
                        cmd.Parameters.Add("@kasa", OleDbType.Integer).Value = 1;
                    }

                    cmd.CommandText = cmd.CommandText.Replace("*", "count(*)");
                    OleDbDataReader rd = cmd.ExecuteReader();
                    rd.Read();
                    yield return rd.GetInt32(0);
                    rd.Close();

                    cmd.CommandText = cmd.CommandText.Replace("count(*)", "*");
                    rd = cmd.ExecuteReader();

                    if (rd.HasRows)
                    {
                        while (rd.Read())
                        {
                            Counter++;

                            SiemensData item = data.Where(x => x.StokKodu == Cevir.Parse<string>(rd["stok_code"])).FirstOrDefault();
                            if (item != null)
                            {
                                item.Barkodlar.Add(Cevir.Parse<string>(rd["barkod"]));
                            }
                            else
                            {
                                item = new SiemensData();
                                item.AltGrupKodu = Cevir.Parse<string>(rd["altgrupad"]);
                                item.AltGrupAdi = Cevir.Parse<string>(rd["altgrupkod"]);
                                item.AnaGrupAdi = Cevir.Parse<string>(rd["anagrupad"]);
                                item.AnaGrupKodu = Cevir.Parse<string>(rd["anagrupkod"]);
                                item.BarkodTipi = Cevir.Parse<byte>(rd["tip_id"]);
                                item.Birim1Adi = Cevir.Parse<string>(rd["birim1_ad"]);
                                item.Birim1Katsayi = Cevir.Parse<int>(rd["birim1katsayi"]);
                                item.Birim2Adi = Cevir.Parse<string>(rd["birim2_ad"]);
                                item.Birim2Katsayi = Cevir.Parse<int>(rd["birim2katsayi"]);
                                item.GenelFiyat = Cevir.Parse<decimal>(rd["genelfiyat1"]);
                                item.DepoFiyati = Cevir.Parse<decimal>(rd["depofiyat1"]);
                                item.ReyonAdi = Cevir.Parse<string>(rd["reyonad"]);
                                item.ReyonKodu = Cevir.Parse<string>(rd["reyonkod"]);
                                item.StokAdi = Cevir.Parse<string>(rd["stok_adi"]);
                                item.StokKodu = Cevir.Parse<string>(rd["stok_code"]);
                                item.Tarih = Cevir.Parse<DateTime>(rd["tarih"]);
                                item.Barkodlar.Add(Cevir.Parse<string>(rd["barkod"]));
                                item.TeminciKodu = Cevir.Parse<string>(rd["temincikodu"]);
                                item.KdvOrani = Cevir.Parse<int>(oranlar[Cevir.Parse<int>(rd["satis_kdv"])]);

                                data.Add(item);
                            }

                            yield return Counter;
                        }
                    }
                }
                cn.Close();
            }
        }



        public IEnumerable<int> StokDosyasiOlustur(string kdvSiralamasi)
        {
            KdvSiralamasi = kdvSiralamasi;

            int count = 0;
            foreach (var item in dataYukle())
            {
                count = item;
                yield return item;
            }

            if (data.Count > 0)
            {
                using (StreamWriter sw = new StreamWriter(FileLocation))
                {
                    foreach (SiemensData item in data)
                    {
                        count++;
                        string fiyat = "";
                        if (item.DepoFiyati > 0)
                        {
                            fiyat = Convert.ToInt32(item.DepoFiyati.ToString("n2").Replace(".", "").Replace(",", "")).ToString();
                        }
                        else
                        {
                            fiyat = Convert.ToInt32(item.GenelFiyat.ToString("n2").Replace(".", "").Replace(",", "")).ToString();
                        }

                        if (fiyat.Length >= 12)
                        {
                            fiyat = fiyat.Substring(0, 12);
                        }
                        else
                        {
                            fiyat = fiyat.PadLeft(12);
                        }

                        string katsayi = item.Birim2Katsayi.ToString("n3").Replace(",", ".");
                        if (katsayi.Length >= 8)
                        {
                            katsayi = katsayi.Substring(0, 8);
                        }
                        else
                        {
                            katsayi = katsayi.PadLeft(8);
                        }

                        string line = String.Format("\"{0}\",\"{1}\",{2},\"{3}\",\"{4}\",\"                    \",\"             \",\"                    \",\"                \",00,1,\"{5}\",\"{6}\",\"{7}\",\"        \",\"        \",\"        \",\"        \",\"{8}\",\"{9}\",\"{10}\",\"{11}\",{12},\"        \",\"    \",   0.000,      0.00,      0.00,      0.00,{13},           0,           0,0.000,{13}, 0,{14},\"100000\",\"{15}\",  0, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000,0,\"{16}\",01,\"{17}\",01,0,0,\"{18}\",  0.00,           0,           0,  0.00,  0.00,  0.00,  0.00,  0.00,0.00,           0,0,0,0,         0,    0,99999,\"{19}\",\"{20}\",\"{21}\"", item.StokKodu.Duzelt(20), item.Barkodlar[0].Duzelt(20), item.BarkodTipi == 0 ? "01" : "02", item.StokAdi.Duzelt(30), item.StokAdi.Length > 30 ? item.StokAdi.Substring(30).Duzelt(30) : " ".Duzelt(30), item.AnaGrupKodu.Duzelt(8), item.AltGrupKodu.Duzelt(8), item.ReyonKodu.Duzelt(8), item.Birim1Adi.Duzelt(8), item.Birim1Adi.Duzelt(4), item.Birim2Adi.Duzelt(8), item.Birim2Adi.Duzelt(4), katsayi, fiyat, item.KdvOrani.ToString("n2").Replace(",", ".").PadLeft(5), item.TeminciKodu.Duzelt(10), (item.Barkodlar.Count > 1 ? item.Barkodlar[1] : " ").Duzelt(20), (item.Barkodlar.Count > 2 ? item.Barkodlar[2] : " ").Duzelt(20), item.Tarih.ToString("yyyyMMdd"), item.AnaGrupAdi.Duzelt(8), item.AltGrupAdi.Duzelt(8), item.ReyonAdi.Duzelt(8));

                        sw.WriteLine(line);

                        yield return count;
                    }

                    sw.Close();
                }
            }
        }
    }
}
